//
//  WBNetworkManager.swift
//  DJWeibo
//
//  Created by demo on 2017/4/3.
//  Copyright © 2017年 demo. All rights reserved.
//

import UIKit
import AFNetworking

//swift的枚举支持任意数据类型
//switch/enum在OC里面只支持整数
enum WBHTTPMethod{
    case GET
    case POST
}

//网络管理工具
class WBNetworkManager: AFHTTPSessionManager {
    //静态区／常量/闭包／在第一次访问时，执行闭包，并且将结果保存在shared常量中
    static let shared = WBNetworkManager()
    
    //访问令牌，所有网络请求都基于此令牌
    //为了保护用户安全，访问令牌有时限，默认用户三天
    var accessToken:String? //= "2.00HlY2nBMaeLpDf54fc7c07e0m9bfX"
    //用户微博id
    var uid:String? = "5365823342"
    
    //用户登录标记（计算型属性）
    var userLogon:Bool{
        return accessToken != nil
    }
    
    
    //专门负责拼接token的网络请求方法
    func tokenRequest(method:WBHTTPMethod = .GET,URLString:String,parameters:[String:Any]?,completion:@escaping (_ json:Any?, _ isSuccess:Bool)->()){
       
        //处理token字典
        //判断token是否为nil，为nil直接返回
        guard let token = accessToken else {
            //FIXME:发送通知，提示用户登录
            print("没有token，需要登录")
            completion(nil, false)
            return
        }
        //1、判断参数字典是否存在，如果为nil，新建一个字典
        var parameters = parameters
        if parameters == nil {
            parameters = [String:Any]()
        }
        
        //2、设置参数字典,代码在此处字典一定有值
        parameters?["access_token"] = token
        
        //调用request发起真正的网络请求方法
        request(URLString: URLString, parameters: parameters, completion: completion)
    }
    
    //使用一个函数封装AFNetworking的 GET/POST请求
    //封装AFN的GET/POST请求
    //参数列表:
    //method:  GET/POST
    //URLString: URLString
    //parameters: 参数字典
    //completion: 完成回调[json(字典／数组),isSuccess]
    
    func request(method:WBHTTPMethod = .GET,URLString:String,parameters:[String:Any]?,completion:@escaping (_ json:Any?, _ isSuccess:Bool)->()){
        
        //成功回调
        let success = {(task:URLSessionDataTask,json:Any?)->() in completion(json,true)
        }
        //失败回调
        let failure = {(task:URLSessionDataTask?,error:Error)->() in
            
            //针对403处理token过期
            //response要强转类型成HTTPURLResponse才有statusCode属性
            if(task?.response as? HTTPURLResponse)?.statusCode == 403{
                print("token过期了")
            //FIXME:发送通知，提示用户再次登录（本方法被谁调用，谁接收到通知谁处理）
            }
            
            print("网络请求错误\(error)")
            completion(nil,false)
        }
        
        if method == .GET {
            get(URLString, parameters: parameters, progress: nil, success:success, failure:failure)
        }else{
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
    }
}
